home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ABUSESRC.ZIP / AbuseSrc / macabuse / imlib / port / mac / event.c < prev    next >
C/C++ Source or Header  |  1997-05-20  |  6KB  |  249 lines

  1. #include "system.h"
  2. #include "image.hpp"
  3. #include "palette.hpp"
  4. #include "mdlread.hpp"
  5. #include "video.hpp"
  6. #include "gifread.hpp"
  7. #include "macs.hpp"
  8. #include "mouse.hpp"
  9. #include "event.hpp"
  10. #include "sprite.hpp"
  11. #include "mackeys.hpp"
  12.  
  13. #include <OSEvents.h>
  14.  
  15. extern CWindowPtr mainwin;
  16. const short MACEVENTS = mUpMask | mDownMask | keyUpMask | keyDownMask | autoKeyMask;
  17. short OldEventMask;
  18. EventRecord MacEv;
  19. int mmoved,mac_ready,keyed;
  20. char mac_modifier[8],mac_oldmod[8];
  21.  
  22. int mac_map[8] = 
  23. {
  24.     JK_COMMAND,
  25.     JK_SHIFT_L,
  26.     JK_CAPS,
  27.     JK_ALT_L,
  28.     JK_CTRL_L,
  29.     JK_SHIFT_R,
  30.     JK_ALT_R,
  31.     JK_CTRL_R,
  32. };
  33.  
  34. void event_handler::flush_screen()
  35. {
  36.   update_dirty(screen);
  37. }
  38.  
  39. int event_handler::get_key_flags()
  40. {
  41.     return 0;
  42. }
  43.  
  44. int event_handler::event_waiting()
  45. {
  46.     unsigned char km[16];
  47.     int i;
  48.     
  49.     if (ewaiting || mmoved || mac_ready || keyed)
  50.         return 1;
  51.  
  52.     // Get key states & map to array
  53.     GetKeys((unsigned long*)&km);
  54.     for (i=0; i<MAC_LAST-MAC_COMMAND; i++) {
  55.         mac_modifier[i] = (km[ (i+MAC_COMMAND) >> 3 ] >> ((i+MAC_COMMAND) & 7)) & 1;
  56.         if (mac_modifier[i] != mac_oldmod[i])
  57.             keyed = 1;
  58.     }
  59.  
  60.     mouse->update();
  61.     if (mouse->lastx() != mouse->x() || mouse->lasty() != mouse->y())
  62.     {
  63.         mmoved = 1;
  64.     }
  65.  
  66.     mac_ready = (mac_ready)? 1 : GetOSEvent(MACEVENTS,&MacEv);
  67.  
  68.     return ewaiting || mmoved ||mac_ready || keyed;
  69. }
  70.  
  71. event_handler::event_handler(image *screen, palette *pal)
  72. {
  73.   CHECK(screen && pal);
  74.   mouse=new JCMouse(screen,pal);
  75.   mhere=1;
  76.   OldEventMask = *((short*)0x0144);
  77.     SetEventMask(MACEVENTS);
  78.   ewaiting=0;
  79.   mmoved = 0;
  80.   mac_ready = 0;
  81. }
  82.  
  83. void event_handler::get_event(event &ev)
  84. {
  85.   int kf,kf_change=0;
  86.   event *ep;
  87.   
  88.   while (!event_waiting()) ;
  89.  
  90.   ep=(event *)events.first();
  91.   if (ep)
  92.   {
  93.       ev=*ep;
  94.     events.unlink((linked_node *)ep);
  95.     delete ep;
  96.     ewaiting = (events.first()!=NULL);
  97.   }
  98.   else if (mmoved) {
  99.       ev.type = EV_MOUSE_MOVE;
  100.     ev.mouse_move.x=mouse->x();
  101.     ev.mouse_move.y=mouse->y();
  102.     ev.mouse_button=mouse->button();
  103.     mouse->mouse_sprite()->x = mouse->x();
  104.     mouse->mouse_sprite()->y = mouse->y();
  105.       mmoved = 0;
  106.   }
  107.   else if (keyed) {
  108.       int found;
  109.       
  110.     ev.mouse_move.x=mouse->x();
  111.     ev.mouse_move.y=mouse->y();
  112.     ev.mouse_button=mouse->button();
  113.         found = -1;
  114.         keyed = 0;
  115.       for (int i=0; i<MAC_LAST-MAC_COMMAND; i++) 
  116.       {
  117.             if (mac_modifier[i] != mac_oldmod[i])
  118.                 if (found<0) 
  119.                     found = i;
  120.                 else
  121.                     keyed = 1;
  122.         }
  123.         ev.key = mac_map[found];
  124.         mac_oldmod[found] = mac_modifier[found];
  125.         if (mac_modifier[found])
  126.             ev.type = EV_KEY;
  127.         else
  128.             ev.type = EV_KEYRELEASE;
  129.     }
  130.   else if (mac_ready)
  131.   {
  132.     // note : that the mouse status
  133.     // should be know even if
  134.     // other event has occured
  135.     ev.mouse_move.x=mouse->x();
  136.     ev.mouse_move.y=mouse->y();
  137.     ev.mouse_button=mouse->button();
  138.  
  139.     switch (MacEv.what)
  140.     {
  141.          /*
  142.         case ConfigureNotify :
  143.               break;
  144.         case updateEvt :
  145.         {
  146.             ev.type=EV_REDRAW;
  147.           ev.redraw.x1=0;
  148.           ev.redraw.y1=0;
  149.           ev.redraw.x2=ev.redraw.x1+10;  // must replace this to redraw whole window!
  150.           ev.redraw.y2=ev.redraw.y1+10;
  151.           ev.redraw.start=NULL;
  152.         } break;
  153.       */
  154.       case keyDown :
  155.       case keyUp :
  156.       case autoKey :
  157.       {
  158.         if (MacEv.what==keyUp)
  159.           ev.type=EV_KEYRELEASE; 
  160.         else
  161.             ev.type=EV_KEY;
  162.         switch ((MacEv.message & keyCodeMask)>>8)
  163.         {
  164.             case 0x7d :     ev.key=JK_DOWN; break;
  165.           case 0x7e :      ev.key=JK_UP;  break;
  166.           case 0x7b :     ev.key=JK_LEFT;  break;
  167.           case 0x7c :     ev.key=JK_RIGHT;  break;
  168.           /*
  169.           case XK_Control_L :     ev.key=JK_CTRL_L;  break;
  170.           case XK_Control_R :     ev.key=JK_CTRL_R;  break;
  171.           case XK_Alt_L :         ev.key=JK_ALT_L;  break;
  172.           case XK_Alt_R :         ev.key=JK_ALT_R;  break;
  173.           case XK_Shift_L :     ev.key=JK_SHIFT_L;  break;
  174.           case XK_Shift_R :     ev.key=JK_SHIFT_R;  break;
  175.           */
  176.           case 0x47 :     ev.key=JK_NUM_LOCK;  break;
  177.           case 0x73 :     ev.key=JK_HOME;  break;
  178.           case 0x77 :     ev.key=JK_END;  break;
  179.           case 0x33 :        ev.key=JK_BACKSPACE;  break;
  180.           case 0x30 :        ev.key=JK_TAB;  break;
  181.           case 0x4c :        ev.key=JK_ENTER;  break;
  182.           case 0x39 :        ev.key=JK_CAPS;  break;
  183.             case 0x35 :        ev.key=JK_ESC;  break;
  184.              case 0x71 :   ev.key=JK_F1; break;
  185.           case 0x78 :   ev.key=JK_F2;break;
  186.           case 0x63 :   ev.key=JK_F3; break;
  187.           case 0x76 :   ev.key=JK_F4; break;
  188.           case 0x60 :   ev.key=JK_F5; break;
  189.           case 0x61 :   ev.key=JK_F6; break;
  190.           case 0x62 :   ev.key=JK_F7; break;
  191.           case 0x64 :   ev.key=JK_F8; break;
  192.           case 0x65 :   ev.key=JK_F9; break;
  193.           case 0x6d :   ev.key=JK_F10; break;
  194.               case 0x67 :   ev.key=JK_INSERT; break;
  195.               case 0x74 :   ev.key=JK_PAGEUP; break;
  196.               case 0x79 :   ev.key=JK_PAGEDOWN; break;
  197.               
  198.           default :
  199.             // modifiers in event.modifiers
  200.                         ev.key = MacEv.message &charCodeMask;
  201.         }
  202.       } break;
  203.       /*
  204.       case MotionNotify : 
  205.       {
  206.         mouse->update(MacEv.xmotion.x,MacEv.xmotion.y,mouse->button());
  207.         ev.type=EV_MOUSE_MOVE;
  208.         ev.mouse_move.x=mouse->x();
  209.         ev.mouse_move.y=mouse->y();
  210.       } break;
  211.       */
  212.       case mouseUp :
  213.       case mouseDown :
  214.       { 
  215.         ev.type=EV_MOUSE_BUTTON;
  216.       } break;
  217.       default:
  218.           ev.type = EV_SPURIOUS;
  219.           break;
  220.     }
  221.     mac_ready=0;
  222.   }
  223.   else
  224.       ev.type = EV_SPURIOUS;
  225. }
  226.  
  227.  
  228. void event_handler::add_redraw(int X1, int Y1, int X2, int Y2, void *Start)
  229. {
  230.   event *ev;
  231.   ev=new event;
  232.   ev->type=EV_REDRAW;
  233.   ev->redraw.x1=X1; ev->redraw.x2=X2;
  234.   ev->redraw.y1=Y1; ev->redraw.y2=Y2; ev->redraw.start=Start;
  235.   events.add_end((linked_node *)ev);
  236. }
  237.  
  238. event_handler::~event_handler() 
  239. {
  240.     SetEventMask(OldEventMask);
  241.     delete mouse; 
  242. }
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.